package com.taxue.designpattern.lession106;

import java.util.ArrayList;
import java.util.List;

/*原型模式的特点
 *  1. 由原型对象自身创建目标对象。也就是说，对
	象创建这一动作发自原型对象本身。
	2.目标对象是原型对象的一个克隆。也就是说，
	通过Prototype模式创建的对象，不仅仅与原型
	对象具有相同的结构，还与原型对象具有相同的
	值。
	3.根据对象克隆深度层次的不同，有浅度克隆与
	深度克隆。
原型模式应用场景
- 在创建对象的时候，我们不只是希望被创建的对象继承
其基类的基本结构，还希望继承原型对象的数据。
- 希望对目标对象的修改不影响既有的原型对象（深度克
隆的时候可以完全互不影响）。
- 隐藏克隆操作的细节。很多时候，对对象本身的克隆需
要涉及到类本身的数据细节。 

 * 
 * */
public class MainClass {
	public static void main(String[] args) {
		Person person01 = new Person();
		person01.setName("lifengxing");
		person01.setAge(30);
		person01.setSex("男");

		Person person102 = person01.clone();

		System.out.println(person01.getName());
		System.out.println(person01.getAge());
		System.out.println(person01.getSex());

		System.out.println(person102.getName());
		System.out.println(person102.getAge());
		System.out.println(person102.getSex());
		System.out.println("===============================================");

		Person person1 = new Person();
		List<String> friends = new ArrayList<String>();
		friends.add("James");
		friends.add("Yao");

		person1.setFriends(friends);

		Person person2 = person1.clone();

		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());

		friends.add("Mike");
		person1.setFriends(friends);
		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());
	}
}
